LVA Datenbanksysteme (LU 1.0 181.129)
Wintersemester 2005/2006

Gruppe B - Beispiel 2

Auction.com

Lösen Sie die folgenden Probleme mittels SQL:

  1. Geben Sie pro Kategorie die Anzahl der Dinge sowie die Anzahl der für sie vorhandenen Bilder aus.
    (Achtung: Dinge, von denen es keine Bilder gibt, erhöhen zwar nicht die Bildanzahl jedoch die Anzahl der Dinge! Vorsicht auch bei Dingen mit mehreren Bildern!)

  2. Geben Sie Namen und Login jenes Users aus, der bei einer Auktion, die meisten Gebote (= die meiste Anzahl) getätigt hat.

  3. Geben Sie Namen und Login aller Anbieter aus, deren Status bereits mindestens 2 Mal geändert wurde und bei denen alle jemals durchgeführten Statusänderungen von ein und demselben Mitarbeiter vollzogen wurden.

  4. Geben Sie alle Mitarbeiter mit der Anzahl aller von ihnen registrierten User aus, die entweder als Bieter mind. 2x geboten oder als Anbieter mind. 2 Auktionen ausgerufen haben.
    (Anmerkung: in der Ausgabe sollen auch jene Mitarbeiter aufscheinen, bei denen diese Anzahl gleich 0 ist!)

  5. Geben Sie alle Auktionen aus, bei denen ausschließlich Dinge versteigert wurden zu denen kein Bild existiert.

  6. Geben Sie alle Paare von Bietern, die bei der selben Auktion geboten haben, gemeinsam mit betreffender Auktionsnummer und der positiven Differenz ihrer dabei getätigten Höchstgebote aus.
    Sortieren Sie die Ausgabe aufsteigend nach Auktionsnummer und absteigend nach Höhe der Differenz.
    (Anmerkung: Achten Sie darauf, dass jedes Paar pro Auktion nur einmal ausgegeben werden soll!)

Lösen Sie die folgenden Probleme mittels PL/SQL:

(Anmerkung: Verwenden Sie, falls notwendig, die "transaction control" Befehle COMMIT, ROLLBACK und SAVEPOINT!)
  1. Schreiben Sie eine Prozedur, die den Status aller Anbieter ändert, deren aktueller Status seit dem als Parameter übergebenen Datum "ermahnt" lautet.
    Ändern Sie diesen im Falle eines positiven Kontostands auf 'normal', andernfalls auf 'gesperrt'.
    (Anmerkung: d.h. das Datum der letzten Statusänderung eines "Ermahnten" muss vor dem übergebenen Datum liegen!)
    Zusätzlich erwartet die Prozedur als Parameter noch die Mitarbeiternummer eines Mitarbeiters. Bevor der Status eines Anbieters geändert und eine Satusänderung eingetragen werden kann, muss die Prozedur überprüfen ob der Mitarbeiter über entsprechende Rechte verfügt. Sollte der Mitarbeiter das notwendige Recht (z.B. 'schreiben') nicht haben, ändern sie die Textmeldung der von Oracle definierte Exception NO_DATA_FOUND auf: "Keine entsprechenden Rechte!".

  2. a) Schreiben Sie eine Funktion, die als Parameter eine Zahl (entspricht einem Preis) übergeben bekommt. Je nach Höhe des Preises soll ein bestimmter Prozentwert returniert werden. Hierfür gelten folgende Regeln:
    b) Schreiben Sie anschließend eine Prozedur, die für alle beendeten Auktionen einen bestimmten Prozentsatz des aktuellen Gebots (Anmerkung: das aktuelle Gebot entspricht also dem Verkaufspreis, da die Auktion ja schon beendet wurde, d.h. ihr Enddatum vor dem aktuellen liegt!) berechnet und diesen Betrag vom Kontostand des betroffenen Anbieters abzieht. Dies betrifft allerdings nur jene Auktionen, deren Attribut "flag" den Wert "false" haben. Zur Berechnung des Prozentsatzes rufen Sie die vorher erstellte Funktion auf, wobei sie als Parameter den Rufpreis der Auktion übergeben. Setzen sie im Zuge dessen das Attribut "flag" jeder abgerechneten Auktion auf "true".

  3. Schreiben Sie einen Trigger der jedesmal ausgelöst wird, nachdem ein neues Gebot für eine Auktion eingetragen wurde. Falls die Auktion noch nicht beendet (EndDatum <= SYSDATE) und das neue Gebot höher als das aktuelle Gebot der Auktion ist, ändern Sie dieses dementsprechend und tragen Sie weiters den neuen Höchstbieter in die DB ein. Ist das Gebot allerdings niedriger, geben sie lediglich die Meldung "Das Gebot ist zu niedrig!" aus.
    Bei Auktionen mit Sofortkauf soll außerdem überprüft werden, ob das neue Gebot höher als der Sofortkaufpreis ist, dann soll nämlich das aktuelle Gebot auf den Sofortkaufpreis gesetzt, der Höchstbieter eingetragen und die Versteigerung beendet werden.
    (Anmerkung: Auktionen können frühzeitig abgebrochen werden, indem einfach das Enddatum auf das aktuelle Datum gesetzt wird!)
    (Tipp: erstellen sie am besten eine Prozedur (stored procedure), die all diese Aufgaben übernimmt und einen Trigger der lediglich diese Prozedur mit den benötigten Parametern (ID, Login, Gebot) aufruft!)